import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

import java.io.IOException;
import java.util.List;

/**
 * @Author:RenPu
 * @Date: 2020/2/6 19:14
 * @Version: 1.0
 * @description: 监视器的测试类：
 * 主要作用 1：数据改变
 *          2：子节点数量的改变
 *          3：状态信息的改变
 */
public class ZKWatches {

    public static void main(String[] args) throws IOException {

        //创建zkClient对象
        ZkClient zkClient = new ZkClient("hadoop:2181");


        //第一种监视器
        dataChangeWatches(zkClient);

        //第二种监视器
        childrenNumWatches(zkClient);


        //为了保证主线程不退出，将线程挂起，让监视器持续工作
        System.in.read();
    }




    //监视数据节点内容改变，以及数据节点删除
    public static void dataChangeWatches(ZkClient zkClient){

        //使用监听器:数据改变监视
        zkClient.subscribeDataChanges("baizhi", new IZkDataListener() {

            /**
             * 处理数据改变的方法
             * @param s 监视的节点 path
             * @param o 改变后的数据
             * @throws Exception
             */
            public void handleDataChange(String s, Object o) throws Exception {

                System.out.println("监视的节点为:"+s+",改变后的数据为:"+o);
            }


            /**
             * 处理数据删除后的方法
             * @param s 监视节点的 path
             * @throws Exception
             */
            public void handleDataDeleted(String s) throws Exception {

                System.out.println("删除的节点为:"+s);
            }
        });

    }


    //监视某个节点下的子节点数量变化的方法
    public static void childrenNumWatches(ZkClient zkClient){


        /**
         * path: 监视的节点
         * childrenList: 改变后的子节点的列表
         */
        //Lamda表达式的写法
        zkClient.subscribeChildChanges("",(path,childrenList)->{

        });


        zkClient.subscribeChildChanges("", new IZkChildListener() {
            @Override
            public void handleChildChange(String s, List<String> list) throws Exception {

                System.out.println("监视的节点为:"+s);

                for (String child : list) {
                    System.out.println("子节点为:"+child);

                }



            }
        });

    }

}
